package com.eureka.eurekaserviceinvoker.config;


import com.eureka.eurekaserviceinvoker.interceptor.MyInterceptor;
import com.eureka.eurekaserviceinvoker.interceptor.MyLoadBalancer;
import org.springframework.beans.factory.SmartInitializingSingleton;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.ClientHttpRequestInterceptor;
import org.springframework.web.client.RestTemplate;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * 配置自定义的注解和拦截器
 */
@Configuration
public class InterceptorConfig {

    //required = false告诉spirng若找不到一个bean实例，也不要报错
    @Autowired(required = false)
    //由于注解MyLoadBalancer使用了Qualifier修饰语注解，所有使用MyLoadBalancer的类都将被装载到这里
    @MyLoadBalancer
    private List<RestTemplate> myTemplates = Collections.emptyList();

    @Bean
    public SmartInitializingSingleton myLoadBalancedRestTemplateInit(){
        System.out.println("-----Bean将在容器初始化创建-----");
        //为已经自动装载后的RestTemplate，添加自定义的拦截器
        return () -> myTemplates.forEach(restTemplate -> {
            //创建自定义拦截器实例
            MyInterceptor mi = new MyInterceptor();
            //获取RestTemplate原来的拦截器
            List<ClientHttpRequestInterceptor> list = new ArrayList(restTemplate.getInterceptors());
            //添加自定义的拦截器到拦截器集合
            list.add(mi);
            //再设置回去
            restTemplate.setInterceptors(list);
        });
    }


}
